package com.kaifamiao.methods;

// 递归(recursion)
// 程序调用自身的编程技巧称为递归
public class Recursion {

    // 求 n! 可以转换为 n * (n-1)!
    // 再转换为 n * (n-1) * (n-2)!
    public long factorial( int n ){
        // 当 n 小于 零时就抛出异常
        if( n < 0 ) {
            throw new IllegalArgumentException("你丫数学是体育老师的媳妇教的");
        }
        // 数学中规定 0 和 1 的阶乘都是 1
        if( n == 0 || n == 1 ) {
            return 1;
        }
        // 调用 当前方法自身 来求 n - 1 的阶乘
        long result = this.factorial(n - 1 );
        // 用 n * (n-1)! 求 n 的阶乘
        return n * result;
    }

    // 用递归求 1 到 n 之间所有自然数之和
    public long sum(int n){
        if( n == 1 ) {
            return 1;
        }
        // 求 1 到 n - 1 之间所有自然数之和
        long result = sum( n - 1 );
        // 用 n 加上 "1到(n-1)之间所有自然数和" 的和
        return n + result;
    }
    public static void main(String[] args) {
        Recursion r = new Recursion();

        long result = r.factorial(5 );
        System.out.println( result );

        result = r.sum( 100 );
        System.out.println( result );
    }
}
